package com.woniu.jifen.service.impl;

import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniu.common.util.ResponseData;
import com.woniu.jifen.dto.CouPonDto;
import com.woniu.jifen.entity.ACoupon;
import com.woniu.jifen.entity.AUserCoupon;
import com.woniu.jifen.service.ACouponService;
import com.woniu.jifen.service.AUserCouponService;
import com.woniu.jifen.mapper.AUserCouponMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

/**
* @author s‘’w
* @description 针对表【a_user_coupon(用户优惠券)】的数据库操作Service实现
* @createDate 2024-05-21 19:29:03
*/
@Service
public class AUserCouponServiceImpl extends ServiceImpl<AUserCouponMapper, AUserCoupon>
    implements AUserCouponService{

    @Autowired
    private AUserCouponMapper userCouponMapper;
    @Autowired
    private ACouponService couponService;
    @Autowired
    private StringRedisTemplate redisTemplate;

    @Override
    public ResponseData<?> queryByUserId(Integer userId) {
        List<CouPonDto> couPonDto = null;

        // 先从 Redis 中获取 couPonDto
        String couPonDtoJson = (String) redisTemplate.opsForHash().get("userCoupon", userId+"");
        if (couPonDtoJson != null) {
            couPonDto = JSON.parseArray(couPonDtoJson, CouPonDto.class);
        } else {
            // 如果 Redis 中没有数据,则从数据库中查询
            couPonDto = userCouponMapper.queryByUserId(userId);
            // 将查询结果存储到 Redis 中
            redisTemplate.opsForHash().put("userCoupon", userId+"", JSON.toJSONString(couPonDto));
        }
        return new ResponseData<>().ok(couPonDto);

    }

    @Override
    public ResponseData<?> updateUsersCoupon(Integer id) {
        redisTemplate.delete("userCoupon");
        return new ResponseData<>().ok(lambdaUpdate().setSql("status= 1")
                .eq(AUserCoupon::getId,id)
                .eq(AUserCoupon::getStatus,0)
                .update());
    }

    @Override
    public ResponseData<?> queryUsersCouponBySortId(Integer userId, Integer sortId) {
        List<CouPonDto> couPonDto = null;

        // 先从 Redis 中获取 couPonDto
        String couPonDtoJson = (String) redisTemplate.opsForHash().get("userCoupon", userId+"");
        if (couPonDtoJson != null) {
            couPonDto = JSON.parseArray(couPonDtoJson, CouPonDto.class);

            couPonDto = couPonDto.stream()
                    .filter(couPonDtoa -> Objects.equals(couPonDtoa.getSortId(), sortId))
                    .collect(Collectors.toList());
        } else {
            couPonDto = userCouponMapper.queryByUserId(userId);
            // 将查询结果存储到 Redis 中
            redisTemplate.opsForHash().put("userCoupon", userId+"", JSON.toJSONString(couPonDto));
            couPonDto = couPonDto.stream()
                    .filter(couPonDtoa -> Objects.equals(couPonDtoa.getSortId(), sortId))
                    .collect(Collectors.toList());

        }
        return new ResponseData<>().ok(couPonDto);
    }


    @Override
    @Transactional(rollbackFor = Exception.class)
    public String initAUserCoupon() {

        redisTemplate.delete("userCoupon");
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();

        // 更新数据
        couponService.lambdaUpdate()
                .le(ACoupon::getEndAt, currentDate) // end_at 小于等于当前日期
                .eq(ACoupon::getAvailable,1)
                .set(ACoupon::getAvailable, 0) // 将 available 设置为 0
                .update();
        List<ACoupon> expiredCoupons = couponService.lambdaQuery()
                .le(ACoupon::getAvailable, 0)
                .list();
        if(expiredCoupons!=null){
            for (ACoupon expiredCoupon : expiredCoupons) {
                lambdaUpdate().setSql("status= 2")
                        .eq(AUserCoupon::getUserCouponId,expiredCoupon.getId()).update();
            }
        }




        return "用户优惠券初始化成功!";
    }

    @Override
    public void rollbackUsersCoupon(Integer id) {
        redisTemplate.delete("userCoupon");
        lambdaUpdate().setSql("status= 0")
                .eq(AUserCoupon::getId,id)
                .eq(AUserCoupon::getStatus,1)
                .update();
    }


}




